// cc.Class({
//     extends: cc.Component,
//     editor: !1,
//     properties: {
//         offset: cc.v2(0, 0),
//         duration: 3
//     },
//     onLoad: function () {
//         this.rc = this.node.getComponent(cc.RenderComponent);
//     },
//     start: function () {
//         this.code = 1;
//         this.addtime = 0;
//         this.uv_delta_x = 1;
//         this.uv_delta_y = 1;
//         this.offset_x = this.uv_delta_x / this.duration / cc.game.getFrameRate();
//         this.offset_y = this.uv_delta_y / this.duration / cc.game.getFrameRate();
//         this.offset_x1 = this.offset_x;
//         this.offset_y1 = -this.offset_y;
//     },
//     onEnable: function () {},
//     switchCode: function () {
//         switch (this.code) {
//             case 1:
//             case 2:
//                 this.code = 3;
//                 break;
//             case 3:
//                 this.code = 4;
//                 break;
//             case 4:
//                 this.code = 1;
//         }
//         switch (this.code) {
//             case 1:
//                 this.offset_x1 = this.offset_x;
//                 this.offset_y1 = this.offset_y;
//                 break;
//             case 2:
//                 this.offset_x1 = -this.offset_x;
//                 this.offset_y1 = this.offset_y;
//                 break;
//             case 3:
//                 this.offset_x1 = -this.offset_x;
//                 this.offset_y1 = -this.offset_y;
//                 break;
//             case 4:
//                 this.offset_x1 = this.offset_x;
//                 this.offset_y1 = -this.offset_y;
//         }
//     },
//     update: function (e) {
//         this.addtime += e;
//         if (this.addtime > 10) {
//             this.addtime = 0;
//         }
//         var t = this.offset.x + this.offset_x1;
//         if (t >= this.uv_delta_x) {
//             t += this.uv_delta_x;
//         }
//         var o = this.offset.y + this.offset_y1;
//         if (o >= this.uv_delta_y) {
//             o += this.uv_delta_y;
//         }
//         this.offset = cc.v2(t, o);
//         this.rc.getMaterial(0).setProperty("uv_offset", this.offset);
//     }
// });

// const { ccclass, property } = cc._decorator;

// @ccclass
// export default class UVOffset extends cc.Component {
//     /** 偏移量 */
//     @property(cc.Vec2)
//     offset: cc.Vec2 = cc.v2(0, 0);

//     /** 持续时间 */
//     @property
//     duration: number = 3;

//     private rc: cc.RenderComponent | null = null;
//     private code: number = 1;
//     private addTime: number = 0;
//     private uvDeltaX: number = 1;
//     private uvDeltaY: number = 1;
//     private offsetX: number = 0;
//     private offsetY: number = 0;
//     private offsetX1: number = 0;
//     private offsetY1: number = 0;

//     /**
//      * 当脚本实例被加载时调用
//      * 建议方法名：initialize
//      */
//     onLoad(): void {
//         this.rc = this.node.getComponent(cc.RenderComponent);
//     }

//     /**
//      * 当脚本实例开始时调用
//      * 建议方法名：initializeProperties
//      */
//     start(): void {
//         this.code = 1;
//         this.addTime = 0;
//         this.uvDeltaX = 1;
//         this.uvDeltaY = 1;
//         this.offsetX = this.uvDeltaX / this.duration / cc.game.getFrameRate();
//         this.offsetY = this.uvDeltaY / this.duration / cc.game.getFrameRate();
//         this.offsetX1 = this.offsetX;
//         this.offsetY1 = -this.offsetY;
//     }

//     /**
//      * 当脚本实例启用时调用
//      * 建议方法名：onComponentEnabled
//      */
//     onEnable(): void { }

//     /**
//      * 切换代码逻辑
//      * 建议方法名：toggleCode
//      */
//     switchCode(): void {
//         switch (this.code) {
//             case 1:
//             case 2:
//                 this.code = 3;
//                 break;
//             case 3:
//                 this.code = 4;
//                 break;
//             case 4:
//                 this.code = 1;
//                 break;
//         }

//         switch (this.code) {
//             case 1:
//                 this.offsetX1 = this.offsetX;
//                 this.offsetY1 = this.offsetY;
//                 break;
//             case 2:
//                 this.offsetX1 = -this.offsetX;
//                 this.offsetY1 = this.offsetY;
//                 break;
//             case 3:
//                 this.offsetX1 = -this.offsetX;
//                 this.offsetY1 = -this.offsetY;
//                 break;
//             case 4:
//                 this.offsetX1 = this.offsetX;
//                 this.offsetY1 = -this.offsetY;
//                 break;
//         }
//     }

//     /**
//      * 每帧更新函数
//      * @param deltaTime - 距离上一帧的时间间隔
//      * 建议方法名：updateFrame
//      */
//     update(deltaTime: number): void {
//         this.addTime += deltaTime;
//         if (this.addTime > 10) {
//             this.addTime = 0;
//         }

//         let newOffsetX = this.offset.x + this.offsetX1;
//         if (newOffsetX >= this.uvDeltaX) {
//             newOffsetX += this.uvDeltaX;
//         }

//         let newOffsetY = this.offset.y + this.offsetY1;
//         if (newOffsetY >= this.uvDeltaY) {
//             newOffsetY += this.uvDeltaY;
//         }

//         this.offset = cc.v2(newOffsetX, newOffsetY);
//         if (this.rc) {
//             this.rc.getMaterial(0).setProperty("uv_offset", this.offset);
//         }
//     }
// }

const { ccclass, property } = cc._decorator;

/** 建议类名: UVOffsetComponent */
@ccclass
export default class UVOffsetComponent extends cc.Component {
    /** 偏移量 */
    @property(cc.Vec2)
    offset: cc.Vec2 = cc.v2(0, 0);

    /** 持续时间 */
    @property
    duration: number = 3;

    private renderComponent: cc.RenderComponent | null = null;
    private currentCode: number = 1;
    private elapsedTime: number = 0;
    private deltaX: number = 1;
    private deltaY: number = 1;
    private currentOffsetX: number = 0;
    private currentOffsetY: number = 0;
    private offsetXPositive: number = 0;
    private offsetYPositive: number = 0;

    /**
     * 当脚本实例被加载时调用
     * 建议方法名：initialize
     */
    onLoad(): void {
        this.renderComponent = this.node.getComponent(cc.RenderComponent);
    }

    /**
     * 当脚本实例开始时调用
     * 建议方法名：initializeProperties
     */
    start(): void {
        this.currentCode = 1;
        this.elapsedTime = 0;
        this.deltaX = 1;
        this.deltaY = 1;
        this.currentOffsetX = this.deltaX / this.duration / cc.game.getFrameRate();
        this.currentOffsetY = this.deltaY / this.duration / cc.game.getFrameRate();
        this.offsetXPositive = this.currentOffsetX;
        this.offsetYPositive = -this.currentOffsetY;
    }

    /**
     * 当脚本实例启用时调用
     * 建议方法名：onComponentEnabled
     */
    onEnable(): void { }

    /**
     * 切换代码逻辑
     * 建议方法名：toggleCode
     */
    switchCode(): void {
        switch (this.currentCode) {
            case 1:
            case 2:
                this.currentCode = 3;
                break;
            case 3:
                this.currentCode = 4;
                break;
            case 4:
                this.currentCode = 1;
                break;
        }

        switch (this.currentCode) {
            case 1:
                this.offsetXPositive = this.currentOffsetX;
                this.offsetYPositive = this.currentOffsetY;
                break;
            case 2:
                this.offsetXPositive = -this.currentOffsetX;
                this.offsetYPositive = this.currentOffsetY;
                break;
            case 3:
                this.offsetXPositive = -this.currentOffsetX;
                this.offsetYPositive = -this.currentOffsetY;
                break;
            case 4:
                this.offsetXPositive = this.currentOffsetX;
                this.offsetYPositive = -this.currentOffsetY;
                break;
        }
    }

    /**
     * 每帧更新函数
     * @param deltaTime - 距离上一帧的时间间隔
     * 建议方法名：updateFrame
     */
    update(deltaTime: number): void {
        this.elapsedTime += deltaTime;
        if (this.elapsedTime > 10) {
            this.elapsedTime = 0;
        }

        let newOffsetX = this.offset.x + this.offsetXPositive;
        if (newOffsetX >= this.deltaX) {
            newOffsetX += this.deltaX;
        }

        let newOffsetY = this.offset.y + this.offsetYPositive;
        if (newOffsetY >= this.deltaY) {
            newOffsetY += this.deltaY;
        }

        this.offset = cc.v2(newOffsetX, newOffsetY);
        if (this.renderComponent) {
            this.renderComponent.getMaterial(0).setProperty("uv_offset", this.offset);
        }
    }
}